/* name: pearl
 * author: 5ab
 * created at: 2024-07-01
 */
#include <iostream>
using namespace std;

#define all(x) (x).begin(), (x).end()
#define ssz(x) (int((x).size()))

auto chmax = [](auto& x, auto y) { if (x < y) x = y; };
auto chmin = [](auto& x, auto y) { if (y < x) x = y; };

using ll = long long;
const int M = 100, mod = 1e9 + 7, inv2 = (mod + 1) / 2;

char s[M + 1];
int f[2][M + 1][M + 1][2];

ll qpow(ll bs, ll ix)
{
	ll mul = bs, ret = 1;
	while (ix)
	{
		if (ix & 1)
			ret = (ret * mul) % mod;
		mul = (mul * mul) % mod;
		ix >>= 1;
	}
	return ret;
}

signed main()
{
	freopen("pearl.in", "r", stdin);
	freopen("pearl.out", "w", stdout);
	
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int n, m, x;
	
	cin >> n >> m >> x >> s;
	
	int c = m;
	for (int i = 0; i < m; i++)
		if (s[i] == '1')
		{
			c = i;
			break;
		}
	
	auto prv = f[0], nxt = f[1];
	prv[m][c][0] = 1;
	
	for (int i = 1; i < n; i++)
	{
		memset(nxt, 0, sizeof f[0]);
		for (int j = 0; j <= m; j++)
			for (int k = 0; k <= m; k++)
				for (int l = 0; l <= m; l++)
				{
					int cc = 1ll * qpow(2, max(0, m - l - 1)) * prv[j][k][0] % mod;
					int cd = 1ll * qpow(2, max(0, m - l - 1)) * prv[j][k][1] % mod;
					if (k + l < j)
						nxt[k + l][l][1] = (nxt[k + l][l][1] + ll(cc) + cd) % mod;
					else if (k + l == j)
					{
						(nxt[j][l][0] += cd) %= mod;
						(nxt[j][l][1] += cc) %= mod;
					}
					else
					{
						(nxt[j][l][0] += cc) %= mod;
						(nxt[j][l][1] += cd) %= mod;
					}
				}
		swap(prv, nxt);
	}
	
	int ans = 0;
	for (int i = 0; i < m; i++)
	{
		int cs[2] = {};
		for (int j = 0; j <= m; j++)
			for (int k = 0; k < 2; k++)
				(cs[k] += prv[i][j][k]) %= mod;
		// cerr << i << " " << cs[0] << " " << cs[1] << endl;
		ans = (ans + (ll(cs[0] + cs[1]) * (qpow(2, m - i - 1) - 1 + mod) + cs[1]) % mod * qpow(2, i)) % mod;
	}
	cout << ans << endl;
	
	return 0;
}
// started coding at: 07-01 09:56:39